/********************************************************************
  *  @FileName: kalman.h
  *  @Version: V1.0
  *  @Date: 2022-01-07 18:33:18
  *  @Description:
  *  @History:---------------------------
  *    1.Date:
  *      Modification:
  *    2.
**********************************************************************************/

#ifndef __kalman_H__
#define __kalman_H__

/***************************************Includes***********************************/

#include <stdint.h>

/***************************************Macros***********************************/
// #define
#define MOVE_AVR_MAX 5

/***************************************Variables***********************************/
typedef struct
{
    float LastP; // 上次估算协方差 初始化值为0.02
    float Now_P; // 当前估算协方差 初始化值为0
    float out;   // 卡尔曼滤波器输出 初始化值为0
    float Kg;    // 卡尔曼增益 初始化值为0
    float Q;     // 过程噪声协方差 初始化值为0.001 越小系统越容易收敛，我们对模型预测的值信任度越高；如果Q为零，那么我们只相信预测值；Q值越大我们对于预测的信任度就越低，而对测量值的信任度就变高；
    float R;     // 观测噪声协方差 初始化值为0.543 R太大，卡尔曼滤波响应会变慢，因为它对新测量的值的信任度降低；越小系统收敛越快，但过小则容易出现震荡；
} KFP_TypeDef;   // Kalman Filter parameter

typedef struct MOVE_AVR_TypeDef {
    uint32_t flow_buf[MOVE_AVR_MAX];
    uint8_t index_cnt;
    uint8_t index_max;
} MOVE_AVR_TypeDef;

/***************************************Functions***********************************/
float moving_avr(MOVE_AVR_TypeDef *type, float d);
float kalmanFilter(KFP_TypeDef *kfp, float input);
/***************************************statement***********************************/
extern KFP_TypeDef KFP_flow;

#endif
/* [] END OF FILE */
